package cn.com.wxd.service.scheduledtask;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.wxd.biz.log.AccessLogService;
import cn.com.wxd.biz.log.AccessLogServiceImpl;
import cn.com.wxd.entity.log.AccesslogInfo;
import cn.com.wxd.entity.log.AccesslogTempInfo;
import cn.com.wxd.common.DateUtil;
import cn.com.wxd.util.action.AccessLogUtil;
import cn.com.wxd.util.framework.EhcacheUtil;
import cn.com.wxd.util.SpringContextHolder;


/**
 * Title:每天的访问记录日志归档
 * Description:将临时表中的数据归档到数据库访问日志表中
 * 
 * Company: Amumu管理平台
 * Copyright: Copyright (c) 2015
 * All right reserved.
 * Created time: 2016-4-14 下午2:14:11
 *
 * @author WangXuDong
 * @version 1.0
 */
public class AccesslogArchiveTask {
	private static final Logger log = LoggerFactory.getLogger(AccesslogArchiveTask.class);
	/**
	 * 从临时表归档到正式表
	 */
	public void run() {
		try {

			//TODO 可以加入分页的方式进行归档
			AccessLogService als = SpringContextHolder.getBean("accessLogService",AccessLogServiceImpl.class);
			List<AccesslogTempInfo> listtemp = als.selectAccesslogFormTemp();
			List<AccesslogInfo> list = new ArrayList<>();
			if(listtemp==null||listtemp.size()<=0){
                log.info(DateUtil.getDatetimeStr()+"今日没有访问数据归档!");
				return;
			}
			for (AccesslogTempInfo aListtemp : listtemp) {  //数据的处理 转存到其他对象List
				AccesslogInfo ai = new AccesslogInfo();
				ai.setIp(aListtemp.getIp());
				ai.setDateTime(aListtemp.getDateTime());
				ai.setCountry(aListtemp.getCountry());
				ai.setCity(aListtemp.getCity());
				ai.setArea(aListtemp.getArea());
				list.add(ai);
			}
			//清空保存临时数据库数据的list
			listtemp.clear();

			//清空当天缓存
			EhcacheUtil.getInstance().removeAll("accessRecordCache");

			//归档到数据库中,并且清理临时数据库
			boolean resu = als.archiveAccessRecode(list);

			if(resu){
                log.info(DateUtil.getDatetimeStr()+":"+AccessLogUtil.getToDayAccessVolume()
                        +"条访问日志归档成功,总访问量:"+AccessLogUtil.getTatorAccessVolume());
				System.gc();//顺便提示系统资源回收
			}else{
                log.error(DateUtil.getDatetimeStr()+"日志数据归档失败!");
			}
		} catch (Exception e) {
            log.error(DateUtil.getDatetimeStr()+"日志数据归档失败!"+e.getMessage(),e);
		}
		
	}
}
